// 1. 实现枚举的方式的状态码 包含200 401 403 404 500 
// 2. 实现一个函数参数是第一题的状态码枚举类型 返回值是true或者false (如果200是true 其他的是false)
// 3. 实现一个类型别名包含既可以是string 也可以是 number
// 4. 实现一个元组类型的变量 第一项的类型是{success:boolean,data:{[{name:string,age和pickName是可选}]}} 第二项是number
// 5. 实现一个函数 类型是函数(参数是接口) 最终的调用效果是
// let res = abc({name:'zhang',link:['http://www.baidu,con',1]}) // res.map(item=>item.count%2!==0) 不会报错

// 不能使用any 
let aaa : any 
aaa = 'string'
aaa = 10

// 枚举
enum ECode{
  OK = 200,
  UNAuthorized = 401,
  NoAccess = 403,
  NotFound = 404,
  InternalServerError = 500
}

function getResCode(code : ECode):boolean{
  switch(code){
    case ECode.OK:
      return true
    case ECode.NoAccess:
    case ECode.NotFound:
    case ECode.UNAuthorized:
    case ECode.InternalServerError:
      return false
    default : 
      return false
  }
}

// 交叉类型  & 
type SOrN = string | number;

//str1 : 交 
let str1: SOrN = '123'

//{success:boolean,data:[{name:string,age和pickName是可选}]}

interface IInnerParams{
  name : string,
  age? : number,
  pickName? : string
}

interface INo1Params{
  success : boolean,
  data : Array<IInnerParams>
}

type TupeType = [INo1Params,number]

let aValue :TupeType = [{success : true,data:[{name:'123'},{name:'123',age:10},{name:'123',pickName:'2334'}]},10] 

// let res = abc({name:'zhang',link:['http://www.baidu,con',1]}) 
// res.map(item=>item.count%2!==0) 不会报错

interface IAbcInterface {
  name: string,
  link : [string,number]
}

// 方法的后面加了一个<T>  T U K L X Y 泛型
function abc1234(params: IAbcInterface):Array<{count:number}>{
  // 元组还是数组
  type ItemType = {count:number}
  let arr : ItemType [] = []; // ts : 操作数组 即使规定了类型 也要赋一个初值
  for (let i = 0; i < 10; i++) {
    arr.push({count:i});
  }
  return arr
}

let resData = abc1234({name:'zhang',link:['http://www.baidu,con',1]})
resData.map(item=>item.count%2!==0)

// 调用 swap<number,string>([10,'20']) 得到结果==> ['20',10] 
// obj = {abc} 
// getValues<obj,'abc'>()


